package com.ican.study2.common.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;

import com.ican.study2.common.common.BusinessException;

public class FileUtils {
	
	/**
	 * 删除文件
	 * @param fullPath 文件路径（如果是文件，包含文件名）
	 */
	public static void deleteFile(String fullPath){
		File f = new File(fullPath);
		if (f.isFile()){
			f.delete();
		}else if (f.isDirectory()) {
			File[] files = f.listFiles();
			for (int i = 0; i < files.length; i++) {
				deleteFile(files[i]);
			}
			f.delete();
		}
	}

	public static void deleteFile(File f) {
		if (f.isFile()){
			f.delete();
		}else if (f.isDirectory()) {
			File[] files = f.listFiles();
			for (int i = 0; i < files.length; i++) {
				deleteFile(files[i]);
			}
			f.delete();
		}
	}
    
    /**
	 * 读取文件内容
	 * @param file  文件
     * @throws BusinessException 
	 */
	public static String file2String(File file) throws BusinessException{
		StringBuffer sb = new StringBuffer();
		InputStreamReader is = null;
		BufferedReader reader = null;
		try {
			is = new InputStreamReader(new FileInputStream(file));
			reader = new BufferedReader(is);
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line);
			}
			return sb.toString();
		} catch (Exception e) {
			throw new BusinessException("读取文件内容时出错！", e);
		}finally{
			if(reader != null){
				try {
					reader.close();
				} catch (Exception e) {}
			}
			if(is != null){
				try {
					is.close();
				} catch (Exception e) {}
			}
		}
	}
	
	/**
	 * 把输入流写入文件
	 * @param is 输入流
	 * @param path  要写入的文件夹
	 * @param fileName 要写入的文件名
	 * @param isAppend 如何存在这个文件，是否追加在文件内容后面。true：追加，false：不追加
	 * @return boolean  写入是否成功
	 * @throws BusinessException
	 */
	public static boolean inputStreanWriteFile(InputStream is, String path, String fileName, boolean isAppend) throws BusinessException {
		FileOutputStream os = null;
		try {
			if(isAppend){
				os = new FileOutputStream(path + fileName, isAppend);
			}else{
				os = new FileOutputStream(path + fileName);
			}
		} catch (Exception e) {
			throw new BusinessException("文件 " + path + fileName + "不存在！", e);
		}
		byte[] bytes = new byte[8192];
		int c = -1;
		try {
			while ((c = is.read(bytes)) != -1) {
				os.write(bytes, 0, c);
			}
			os.flush();
		} catch (Exception e) {
			throw new BusinessException("文件内容写入文件 " + path + fileName + "时出错！", e);
		} finally{
			if(os != null){
				try {
					os.close();
				} catch (Exception e) {}
			}
			if(is != null){
				try {
					is.close();
				} catch (Exception e) {}
			}
		}
		return true;
	}
	
	/**
	 * 备份文件
	 * @param file 文件
	 * @param path  要写入的文件夹
	 * @param fileName 要写入的文件名
	 * @param isAppend 如何存在这个文件，是否追加在文件内容后面。true：追加，false：不追加
	 * @return boolean  写入是否成功
	 * @throws BusinessException
	 */
	public static boolean backFile(File file, String path, String fileName, boolean isAppend) throws BusinessException {
		FileInputStream is = null;
		try {
			is = new FileInputStream(file);
		} catch (Exception e) {
			throw new BusinessException("文件不存在！", e);
		}
		return inputStreanWriteFile(is, path, fileName, isAppend);
	}
	
	/**
	 * 把内容写入文件
	 * @param content 内容
	 * @param path  要写入的文件夹
	 * @param fileName 要写入的文件名
	 * @param isAppend 如何存在这个文件，是否追加在文件内容后面。true：追加，false：不追加
	 * @return boolean  写入是否成功
	 * @throws BusinessException
	 */
	public static boolean stringWriteFile(String content, String path, String fileName, boolean isAppend) throws BusinessException {
		FileWriter fw= null;
		try {
			if(isAppend){
				fw = new FileWriter(path + fileName, isAppend);
			}else{
				fw = new FileWriter(path + fileName);
			}
			fw.write(content);
			fw.flush();
		} catch (Exception e) {
			throw new BusinessException("文件内容写入文件 " + path + fileName + "时出错！", e);
		} finally{
			if(fw != null){
				try {
					fw.close();
				} catch (Exception e) {}
			}
		}
		return true;
	}
	
	/**
     * 文件夹是否存在，不存在创建目录
     * @param path  要写入的文件夹
     * @return boolean  true：文件目录存在，false：文件目录不存在。
     */
    public static boolean folderIsExists(String path){
        File file = new File(path);
        if(!file.exists()){//文件夹是否存在，不存在创建新文件目录
            file.mkdirs();
            return false;
        }
        return true;
    }
		
	/**
	 * 文件夹是否存在，不存在创建目录。文件是否存在
	 * @param path  要写入的文件夹
	 * @param fileName 要写入的文件名
	 * @return boolean  true：文件存在，false：文件不存在。
	 */
	public static boolean folderAndFileIsExists(String path, String fileName){
		File file = new File(path);
		if(file.exists()){//文件夹是否存在
			file = new File(path + fileName);
			if(file.exists()){//文件是否存在
				return true;
			}
		}else{//创建新文件目录
			file.mkdirs();
		}
		return false;
	}
	
	/**
	 * 文件夹是否存在，不存在创建目录。文件是否存在,存在则根据dealMode进行处理
	 * @param path  要写入的文件夹
	 * @param fileName 要写入的文件名
	 * @param dealMode  存在相同文件时处理方式：null:不处理；"1"：先备份文件（备份文件名样式：xxxx时间戳.xml.bak）；"2"：自动加时间戳；"自定义后缀"：加上用户自定义的后缀
	 * @return fileName  新的文件名
	 * @throws BusinessException
	 */
	public static String folderAndFileIsExists(String path, String fileName, String dealMode) throws BusinessException {
		File file = new File(path);
		if(file.exists()){//文件夹是否存在
			file = new File(path + fileName);
			if(file.exists()){//文件是否存在
				if(dealMode == null){

				}else if("1".equals(dealMode.trim())){
					int index = fileName.lastIndexOf(".");
					String temp = fileName.substring(0, index) + 
						DateUtils.DatetoString(null, DateUtils.FULL_PATTERN_SSS) + 
						fileName.substring(index) + ".bak";
					backFile(file, path, temp, false);
				}else if("2".equals(dealMode.trim())){
					int index = fileName.lastIndexOf(".");
					fileName = fileName.substring(0, index) + DateUtils.DatetoString(null, DateUtils.FULL_PATTERN_SSS) + fileName.substring(index);
				}else{
					int index = fileName.lastIndexOf(".");
					fileName = fileName.substring(0, index) + dealMode.trim() + fileName.substring(index);
					file = new File(path + fileName);
					if(file.exists()){//文件是否存在
						throw new BusinessException("文件" + path + fileName + "已经存在！");
					}
				}
			}
		}else{//创建新文件目录
			file.mkdirs();
		}
		return fileName;
	}
}
